<?PHP

namespace SDF\Common;
use SDF\Core\Config;

/**
 * 常用函数类
 * @package SDF\Common
 */
class Utils {
    /**
     * 判断是否ajax方式
     * @return bool
     */
    public static function isAjax(){
        if (!empty($_REQUEST['ajax']) || (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest')) {
            return true;
        }
        return false;
    }

    /**
     * 把字节的文件大小转换为更容易识别的单位格式
     * @param int $size
     * @return string
     */
    public static function formatBytes($size) {
        /*$units = array(' B', ' KB', ' MB', ' GB', ' TB');
        for ($i = 0; $size >= 1024 && $i < 4; $i++) $size /= 1024;*/
        $units = array(' B', ' KB', ' MB', ' GB');
        for ($i = 0; $size >= 1024 && $i < 3; $i++) $size /= 1024;

        return round($size, 2).$units[$i];
    }

    /**
     * 把字符串的文件大小转换为字节数
     * @param string $Size 文件大小（字符串，如：1M）
     * @return float|int
     */
    public static function StringSizeToBytes($Size){
        $Unit = strtolower($Size);
        $Unit = preg_replace('/[^a-z]/', '', $Unit);
        $Value = intval(preg_replace('/[^0-9]/', '', $Size));
        $Units = array('b'=>0, 'k'=>1, 'm'=>2, 'g'=>3, 't'=>4);
        $Exponent = isset($Units[$Unit]) ? $Units[$Unit] : 0;
        return ($Value * pow(1024, $Exponent));
    }

    /**
     * 获取ip地址
     * @return string
     */
    public static function GetIP() {
        if (!empty($_SERVER["HTTP_X_FORWARDED_FOR"])) {
            $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
        }
        else if (!empty($_SERVER["HTTP_CLIENT_IP"])) {
            $ip = $_SERVER["HTTP_CLIENT_IP"];
        }
        else if (!empty($_SERVER["REMOTE_ADDR"])) {
            $ip = $_SERVER["REMOTE_ADDR"];
        }
        else if (getenv("HTTP_X_FORWARDED_FOR")) {
            $ip = getenv("HTTP_X_FORWARDED_FOR");
        }
        else if (getenv("HTTP_CLIENT_IP")) {
            $ip = getenv("HTTP_CLIENT_IP");
        }
        else if (getenv("REMOTE_ADDR")) {
            $ip = getenv("REMOTE_ADDR");
        }
        else {
            $ip = "Unknown";
        }
        return $ip;
    }

     /**
     * 删除字符串里面的Emoji表情字符
     * @param $text
     * @return mixed|string
     */
    /*public static function removeEmoji($text) {
        $clean_text = "";
        // Match Emoticons
        $regexEmoticons = '/[\x{1F600}-\x{1F64F}]/u';
        $clean_text = preg_replace($regexEmoticons, '', $text);

        // Match Miscellaneous Symbols and Pictographs
        $regexSymbols = '/[\x{1F300}-\x{1F5FF}]/u';
        $clean_text = preg_replace($regexSymbols, '', $clean_text);

        // Match Transport And Map Symbols
        $regexTransport = '/[\x{1F680}-\x{1F6FF}]/u';
        $clean_text = preg_replace($regexTransport, '', $clean_text);

        // Match Miscellaneous Symbols
        $regexMisc = '/[\x{2600}-\x{26FF}]/u';
        $clean_text = preg_replace($regexMisc, '', $clean_text);

        // Match Dingbats
        $regexDingbats = '/[\x{2700}-\x{27BF}]/u';
        $clean_text = preg_replace($regexDingbats, '', $clean_text);

        return $clean_text;
    }*/

    /*public static function remove_emoji($text){
        return preg_replace('/([0-9|#][\x{20E3}])|[\x{00ae}|\x{00a9}|\x{203C}|\x{2047}|\x{2048}|\x{2049}|\x{3030}|\x{303D}|\x{2139}|\x{2122}|\x{3297}|\x{3299}][\x{FE00}-\x{FEFF}]?|[\x{2190}-\x{21FF}][\x{FE00}-\x{FEFF}]?|[\x{2300}-\x{23FF}][\x{FE00}-\x{FEFF}]?|[\x{2460}-\x{24FF}][\x{FE00}-\x{FEFF}]?|[\x{25A0}-\x{25FF}][\x{FE00}-\x{FEFF}]?|[\x{2600}-\x{27BF}][\x{FE00}-\x{FEFF}]?|[\x{2900}-\x{297F}][\x{FE00}-\x{FEFF}]?|[\x{2B00}-\x{2BF0}][\x{FE00}-\x{FEFF}]?|[\x{1F000}-\x{1F6FF}][\x{FE00}-\x{FEFF}]?/u', '', $text);
    }*/

    /**
     * 更具原图地址，格式化缩略图地址
     * @param $url
     * @param int $w
     * @param int $h
     * @param null $host
     * @return string
     * @throws \Exception
     */
    public static function format_thumb($url,$w=600,$h=600,$host = null){
        $arr = parse_url($url);
        $new_url = array(
            "scheme" => isset($arr['scheme'])?$arr['scheme']:'http',
            "host" => $host?$host:Config::get('thumb_host',@$arr['host']),
            "path" => isset($arr['path'])?$arr['path']:'404.png',
            "query" => isset($arr['query'])?$arr['query']:'',
            "fragment" => isset($arr['fragment'])?$arr['fragment']:'',
        );
        $new_url['path'] = "tb/{$w}x{$h}".$new_url['path'];
        $url = "{$new_url['scheme']}://{$new_url['host']}/{$new_url['path']}";
        return $url;
    }

    /**
     * 刷新缓冲区，将缓冲区的内容全部输出到浏览器。
     * 一般还需要搭配：ini_set('max_execution_time', 0);
     * 刷新PHP程序的缓冲，而不论PHP执行在何种情况下（CGI ，web服务器等等）。该函数将当前为止程序的所有输出发送到用户的浏览器。
        flush() 函数不会对服务器或客户端浏览器的缓存模式产生影响。因此，必须同时使用 ob_flush() 和flush() 函数来刷新输出缓冲。
        个别web服务器程序，特别是Win32下的web服务器程序，在发送结果到浏览器之前，仍然会缓存脚本的输出，直到程序结束为止。
        有些Apache的模块，比如mod_gzip，可能自己进行输出缓存，这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。
        甚至浏览器也会在显示之前，缓存接收到的内容。例如 Netscape 浏览器会在接受到换行或 html 标记的开头之前缓存内容，并且在接受到 </table> 标记之前，不会显示出整个表格。
        一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面，所以必须发送一些额外的空格来让这些浏览器显示页面内容。
     * @param int $byte
     * @param string $end_str
     */
    public static function flush($byte = 1024*4,$end_str="</br>\n"){
        echo str_repeat(" ",$byte);//输出大量空格
        echo $end_str;//输出结尾
        ob_flush();
        flush();
    }
}
